﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL.Cliente
{
    public class GetClienteList
    {
        int _count;



        public int Count(string estadoStr,
                                                           bool bitVerAnula,
                                                           string clienteStr,
                                                           int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {
            return _count;
        }



        private IQueryable<ClienteListInfo> ApplySelect_ClienteListInfo()
        {
            var q = from a in DbUtil.Db.Clientes
                    select new ClienteListInfo
                    {
                        bitActivo = a.bitActivo,
                        celular = a.celular,
                        descripcion = a.descripcion,
                        estado = a.GrupoDatoitem.descripcion,
                        email = a.email,
                        idInternal = a.idInternal,
                        nacionalidad = a.Nacionalidad.descripcion,
                        numDocumento = a.numDocumento,
                        telefono = a.telefono,
                        tipoDocumento = a.TipoDocumento.abreviacion,
                        FechaCre = a.fechaCre,
                        idEstado = a.idEstado,
                    };
            return q;
        }
        private IQueryable<ClienteListInfo> ApplySort(IQueryable<ClienteListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "numDocumento":
                    q = q.OrderBy(b => b.numDocumento);
                    break;
                case "numDocumento DESC":
                    q = q.OrderByDescending(b => b.numDocumento);
                    break;

                case "bitActivo":
                    q = q.OrderBy(b => b.bitActivo);
                    break;
                case "bitActivo DESC":
                    q = q.OrderByDescending(b => b.bitActivo);
                    break;

                case "celular":
                    q = q.OrderBy(b => b.celular);
                    break;
                case "celular DESC":
                    q = q.OrderByDescending(b => b.celular);
                    break;


                case "nacionalidad":
                    q = q.OrderBy(b => b.nacionalidad);
                    break;
                case "nacionalidad DESC":
                    q = q.OrderByDescending(b => b.nacionalidad);
                    break;


                case "tipoDocumento":
                    q = q.OrderBy(b => b.tipoDocumento);
                    break;
                case "tipoDocumento DESC":
                    q = q.OrderByDescending(b => b.tipoDocumento);
                    break;


                case "telefono":
                    q = q.OrderBy(b => b.telefono);
                    break;
                case "telefono DESC":
                    q = q.OrderByDescending(b => b.telefono);
                    break;
                default:
                    q = q.OrderByDescending(b => b.FechaCre).OrderByDescending(p => p.numDocumento);
                    break;
            }
            return q;
        }



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<ClienteListInfo> Execute(string estadoStr,
                                                           bool bitVerAnula,
                                                           string clienteStr,
                                                           int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {
            if (!clienteStr.HasValue())
                clienteStr = "";

            var q = ApplySelect_ClienteListInfo();


            q = q.Where(a => (a.bitActivo == true | a.bitActivo == !bitVerAnula)
                              & a.descripcion.Contains(clienteStr)
                              & (estadoStr == "0" ? a.idEstado != 0 : a.idEstado == Convert.ToInt32(estadoStr)));




            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }



    }
}
